package fr.nts.framework.database.ibatis.dao;

import java.util.List;

import javax.annotation.Resource;

import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.slf4j.Logger;

import fr.nts.framework.database.ibatis.model.AHibatisModel;

/**
 * Représente un DAO qui utilise le framework IBATIS.
 * Cette classe abstraite pré-définie un certain nombre méthodes utilitaire pour manipuler des entités.
 * 
 * @author sco
 * @version 1.0.0
 */
public abstract class AHibatisDao<T extends AHibatisModel<?>, PK extends Object> extends SqlSessionDaoSupport{

	private final static String FIND_ALL_KEY = ".findAll";
	private final static String INSERT_KEY = ".insert";
	
	@Resource(name = "sqlSession")
	public void setSqlSession(SqlSessionTemplate sqlSessionTemplate){
		setSqlSessionTemplate(sqlSessionTemplate);
	}
	
	
    /**
     * Sauvegarde un bean entité.
     * Met à jour la base de données en conséquence.
     * 
     * @param bo L'objet entité à sauvegarder.
     */
	public void save(T bo){
		getSqlSession().insert(getMapperNamespace() + INSERT_KEY, 
				               bo);
	}
	
	
	/**
	 * Retourne la liste de tous les objets du type paramétré
	 */
	@SuppressWarnings("unchecked")
	public List<T> findAll(){
		return getSqlSession().selectList(getMapperNamespace() + FIND_ALL_KEY);
	}
	
	
    /**
     * Liste tous les objets du type paramétré
     */
    public void print(){
    	List<T> objets = findAll();
    	getLog().debug("On a {} objets pour l'entité de type [{}]", objets.size(), getMapperNamespace());
    	
    	if(getLog().isDebugEnabled()){
	    	for(T obj: objets){
	    		getLog().debug("{}", obj);
	    	}
    	}
    }
    
    
	/**
	 * Le namespace hibatis associé
	 */
	protected abstract String getMapperNamespace();  
	
    protected abstract Logger getLog();
}